package main

import (
	"fmt"
	"sync"
)

var a []int
var b chan int //需要指定通道中元素的类型   通道的声明
var c chan int

var wg sync.WaitGroup

func noBufChannel() {
	fmt.Println(b)
	//通道是引用类型的
	//通道的初始化，必须初始化才能使用make初始化
	b = make(chan int) //不带缓存区通道的初始化
	wg.Add(1)
	go func() {
		defer wg.Done()
		x := <-b
		fmt.Printf("后台goroutine从通道b中取到了%v \n", x)
	}()
	b <- 10 //hang住了
	fmt.Println("10发送到通道b中了")
	wg.Wait()
	close(b)

}

func bufChannel() {
	fmt.Println(b)
	//通道是引用类型的
	//通道的初始化，必须初始化才能使用make初始化
	c = make(chan int, 4) //不带缓存区通道的初始化
	c <- 10               //hang住了
	fmt.Println("10发送到通道c中了")
	x := <-c //被取走了一个
	fmt.Printf("x===%v \n", x)
	c <- 20 //因为make中buffer=4
	fmt.Println("20发送到通道c中了")

	c <- 30 //因为make中buffer=4
	fmt.Println("30发送到通道c中了")
	c <- 40 //因为make中buffer=4
	fmt.Println("40发送到通道c中了")
	c <- 50 //因为make中buffer=4
	fmt.Println("50发送到通道c中了")
	//c <- 60 //报错了，超过了长度4
	close(c)           //先关闭，再循环
	for i := range c { // 通道关闭后会退出for range循环
		fmt.Println(i)
	}

}

func main() {

	//1.发送值 ch1 <- 1

	//2.接收值 ch2 := <-ch1

	//3.关闭 close()
	noBufChannel()
	bufChannel()

}
